/*
 * ExactCliqueLifter.cpp
 *
 *  Created on: Jan 24, 2014
 *      Author: ik
 */

#include <ExactCliqueLifter.h>

ExactCliqueLifter::ExactCliqueLifter(Grafo &grafo, Cliquer &cliquer) : CliqueLifter(grafo, cliquer),
		_vertices(*(new VertexSet(_grafo.getN()))), _enumerable(*(new Lista(_grafo.getN()))),
		_RR(*(new ProjectableCliqueSet(_grafo.getN())))
{
}

ExactCliqueLifter::~ExactCliqueLifter()
{
	delete &_enumerable;
	delete &_RR;
	delete &_vertices;
}

int ExactCliqueLifter::calculaLambda(const VertexSet& soporte, const IntValueArray& coeficientes, VertexSet& proyectada, int pi)
{
	//	if (!_grafo.isClique(*W))
	//	{
	//		cout << "W no es clique!!!!!!!!!!!!!!!!";
	//		exit(0);
	//	}
		_vertices.copyAll(soporte);
		_vertices.removeAll(proyectada);
//		_vertices.print();

	//
	//	cout << "++++++++++++++++ TESTE DE CLIQUER ++++++++++\n" << "vertices: ";
	//	_vertices.print();
	//	IntValueArray unit(_grafo.getN());
	//	for (int i = 0; i < _grafo.getN(); i++)
	//		unit.setValue(i, 1);
	//	RDCliquer sinpesos(_grafo, false);
	//	int conbuscador = _cliquer.optimize(unit, _vertices, _RR);
	//	cout << "con buscador e pesos unitários: " << conbuscador;
	//	_RR.print();
	//	_RR.removeAll();
	//	int conrd = sinpesos.optimize(_vertices, _RR);
	//	cout << "con RD sem pesos: " << conrd;
	//	_RR.print();
	//	if (conbuscador != conrd)
	//	{
	//		cout << "HAY UN PROBLEMA con RDCliquer!!!!!!!!!!!!!! conbuscador=" << conbuscador << " conrd=" << conrd << endl;
	//		exit(0);
	//	}
	//	cout << "+++++++++++++++++++++++++++++++++++++++" << endl;
	//

		_RR.removeAll();
		int valor = _cliquer.optimize(coeficientes, _vertices, _RR, 0);
		return valor - pi;
}
